// 此文件专用于路由的权限拦截

// 导入router
import router from '@/router/index.js'
// 导入store
import store from '@/store/index.js'
// 定义路由白名单
const WHITE_LIST = ['/login', '/404']

// 导入进度条和进度条样式
import NProgress from 'nprogress'
import 'nprogress/nprogress.css'

// 添加导航守卫

// 设置全局前置守卫 从一个路由跳转到另一个路由时触发
// 因为发起请求获得数据需要时间，所以用 async await优化
router.beforeEach(async(to, from, next) => {
  // to 要去的路由对象 目标路由
  // from 正要离开的路由对象 当前路由
  // next 放行函数，调用该方法执行resolve钩子

  // 开启进度条
  NProgress.start()

  // 1. 得到token
  const token = store.getters.token
  // 2. 判断token是否存在
  if (!token) {
    // 代码进到这里说明token不存在,那么久判断当前访问的页面是否在白名单中
    const bool = WHITE_LIST.includes(to.path)
    if (bool) {
      // 存在于白名单,代码放行
      next()
    } else {
      // 不存在于白名单，挡回登录页
      // 此时我们注意到，虽然应该挡回登录页，但是应该保留挡回登录页之前的文件路径
      const _redirect = to.path
      router.push('/login?_redirect=' + _redirect)
    }
  } else {
    // 3. 判断当前访问的页面是否是login页
    if (to.path === '/login') {
      // 是登录页，跳转到首页
      router.push('/')
      NProgress.done()
    } else {
      // 不是，代码放行
      // 声明一个用于保存用户信息的常量
      const userInfo = store.getters.userInfo
      // 判断是否存在用户信息
      if (!userInfo.username) {
        // 不存在：得到用户信息
        const myinfo = await store.dispatch('user/getUserInfo')
        // 再得到用户路由（静态路由&权限路由）
        const userRouter = await store.dispatch(
          'permission/getRoutes',
          myinfo.roles.menus
        )
        // 动态将用户路由添加到路由对象中
        // router.addRoutes(userRouter) // 这个是添加动态路由的，需要时间
        router.addRoutes([
          ...userRouter,
          { path: '*', redirect: '/404', hidden: true }
        ])
        next(to.path) // 重新加载这个路由（固定用法）
      }
      // 存在用户信息就直接放行
      next()
    }
  }
})

// 设置全局后置钩子 进入到对应的路径文件后执行
router.afterEach((to, from) => {
  // 关闭进度条
  NProgress.done()
})
